#ifndef FILE_H
#define FILE_H

#include <memory>
#include <QFile>

#include "data.h"
#include "config.h"

namespace File {        // 该名字空间负责分析文件

    using std::shared_ptr;

    class Question;

    class Option {      // Option类是一个选项
    public:
        explicit Option(QStringList&& message) { set_option(std::move(message)); }
        QList<Data::Road> exhaust() const;      // 穷尽本选项和所有子问题的所有路线
        void set_child(shared_ptr<Question> cq) { child_ques = cq; }
    private:
        QString value;
        shared_ptr<Question> child_ques;
        QStringList loves;
        void set_option(QStringList&& message);     // 设置选项
    };

    class Question {        // Question类是一个问题
    public:
        Question() { }
        explicit Question(QTextStream& file) { read_ques(file); }
        QList<Data::Road> exhaust() const;      // 穷尽本问题的所有路线
    private:
        QList<Option> options;
        void read_ques(QTextStream& file);      // 从文件中阅读问题信息
    };

    class Mayu {        // Mayu类是一个研究员
    public:
        explicit Mayu(const QString& file =file_name) { read_file(file); }
        const QList<Data::Roads>& operator[](const QString& name) const;        // 对应角色的线路
        const QList<Data::Road>& failure() const { return bachelor; }
        int need(const QString& name) const { return needs[name]; }
    private:
        Data::Favorability needs;
        QList<Data::Female_lead> roles;
        QList<Data::Road> bachelor;
        void read_file(const QString& file);        // 读取文件。file必须存在
        void analyse(Data::Road&& road, const QList<Question>& later);      // 核心功能：穷举式解析选项
    };

}

#endif // FILE_H
